package org.example;

import org.example.mouse.GHubController;

import java.awt.MouseInfo;
import java.awt.Point;

public class SmoothMouseMover {

    // 这是你已经有的相对移动函数
    private static void mouseXY(int x, int y) {
        GHubController.mouseXY(x, y);
    }

    /**
     * 平滑移动到绝对位置
     * @param targetX 目标X坐标
     * @param targetY 目标Y坐标
     * @param durationMs 移动耗时(毫秒)
     */
    public static void smoothMoveTo(int targetX, int targetY, int durationMs) {
        // 获取当前鼠标位置
        Point currentPos = MouseInfo.getPointerInfo().getLocation();
        int startX = currentPos.x;
        int startY = currentPos.y;
//        System.out.println("current x:" + startX);
//        System.out.println("current y:" + startY);

        // 计算总移动距离
        int totalDx = targetX - startX;
        int totalDy = targetY - startY;

        // 计算合适的步数（基于距离和时间的平衡）
        double distance = Math.sqrt(totalDx * totalDx + totalDy * totalDy);
        int steps = calculateOptimalSteps(distance, durationMs);
        int stepDelay = durationMs / steps;

        // 执行平滑移动
        for (int i = 1; i <= steps; i++) {
            double progress = (double) i / steps;
            progress = applyEasing(progress); // 应用缓动函数

            // 计算当前应该到达的位置
            int currentTargetX = startX + (int)(totalDx * progress);
            int currentTargetY = startY + (int)(totalDy * progress);

            // 获取实际当前位置（防止外部干扰）
            Point nowPos = MouseInfo.getPointerInfo().getLocation();

            // 计算这一步需要相对移动的距离
            int stepDx = currentTargetX - nowPos.x;
            int stepDy = currentTargetY - nowPos.y;

            // 执行相对移动
            if (stepDx != 0 || stepDy != 0) {
                mouseXY(stepDx, stepDy);
            }

            // 控制移动速度
            try {
                Thread.sleep(stepDelay);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }

        // 最终精确定位（防止累计误差）
        Point finalPos = MouseInfo.getPointerInfo().getLocation();
        mouseXY(targetX - finalPos.x, targetY - finalPos.y);
    }

    /**
     * 计算最佳步数
     */
    private static int calculateOptimalSteps(double distance, int durationMs) {
        // 每像素至少0.3毫秒，最少10步，最多不超过durationMs/5
        return (int) Math.min(
                Math.max(distance * 0.3, 10),
                Math.max(durationMs / 5, 50)
        );
    }

    /**
     * 缓动函数 - 平滑加速和减速
     */
    private static double applyEasing(double t) {
        // 三次缓动函数
        return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
    }

    public static void main(String[] args) {
        SmoothMouseMover mover = new SmoothMouseMover();

        // 示例：从当前位置平滑移动到(800, 500)，耗时1200毫秒
        mover.smoothMoveTo(10, 10, 1);

        // 等待1秒后再次移动
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 移动到另一个位置
//        mover.smoothMoveTo(400, 300, 50);
    }
}